package com.sztz.excel;

import cn.hutool.core.collection.CollUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

/**
 * 固定每行数据格式的Excel读取监听器
 * @author yzy
 * @date 2022/8/3 11:15
 */
@Slf4j
public class ExcelVoListener<T> extends AnalysisEventListener<T> {
    /**
     * 每批次最大处理行数
     */
    private int batchCount = 2000;
    /**
     *创建list集合封装最终的数据
     */
    private List<T> dataList = new ArrayList<>();
    /**
     * 解析数据的具体处理方法
     */
    private Consumer<List<T>> consumer;

    public ExcelVoListener(Consumer<List<T>> consumer){
        this.consumer = consumer;
    }
    /**
     * 解析到的数据处理
     * @param data 解析出的数据
     * @param context 解析上下文
     * @author yzy
     * @date 2022/8/03 11:22
     */
    @Override
    public void invoke(T data, AnalysisContext context) {
        dataList.add(data);
        if (batchCount <= dataList.size()) {
            log.info("共解析到{}行数据",dataList.size());
            consumer.accept(dataList);
            dataList.clear();
        }
    }
    /**
     * 最后剩下的数据处理
     * @param context 解析上下文
     * @author yzy
     * @date 2022/8/03 11:22
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        if(CollUtil.isNotEmpty(dataList)){
            log.info("最后解析到{}行数据",dataList.size());
            consumer.accept(dataList);
        }
        log.info("所有数据解析完成！");
    }
    /**
     * 可以设置每批次的数据
     */
    public void setBatchCount(int batchCount){
        this.batchCount = batchCount;
    }
}
